/**
 * 
 */
package com.bstek.code.view.singletable;


import org.springframework.stereotype.Component;

import com.bstek.dorado.common.event.ClientEvent;
import com.bstek.dorado.data.type.DataType;
import com.bstek.dorado.view.View;
import com.bstek.dorado.view.widget.Container;
import com.bstek.dorado.view.widget.base.Button;
import com.bstek.dorado.view.widget.base.toolbar.Label;
import com.bstek.dorado.view.widget.base.toolbar.ToolBar;
import com.bstek.dorado.view.widget.data.DataSet;
import com.bstek.dorado.view.widget.grid.DataGrid;
import com.bstek.dorado.view.widget.grid.RowNumColumn;
import com.bstek.dorado.view.widget.grid.RowSelectorColumn;
import com.bstek.dorado.view.widget.layout.HBoxLayout;
import com.bstek.dorado.view.widget.layout.Pack;
import com.bstek.dorado.view.widget.layout.VBoxLayout;
import com.bstek.dorado.view.widget.list.SelectionMode;
import com.bstek.dorado.web.DoradoContext;

/**
 * @description 单表创建监听类
 * @author zhangkun
 * @date 2020年6月8日
 *
 */
@Component(SingleTableListener.BEAN_ID)
public class SingleTableListener {
	public final static String BEAN_ID = "SINGLETABLELISTENER";
	
	private Container mainCon;
	private DataType dataType;
	private DataSet dummyDataSet;
	private String[] tabs;
	
	/**
	 * 
	 * @description 页面加载时动态生成控件
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @param view
	 * @throws Exception 
	 */
	public void onInit(View view) throws Exception{
		mainCon  = (Container) view.getViewElement("mainCon");
		dummyDataSet = (DataSet) view.getViewElement("dsDummy");
		dataType = dummyDataSet.getDataType();
		tabs = getTabs();
		generateGrids(tabs);
		addBtnNext();
	}

	/**
	 * @description 根据选择的表，生成对应控件
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @param tabs
	 * @param mainCon
	 */
	private void generateGrids(String[] tabs) {
		for(String tab:tabs){
			generateGrid(tab);
		}
	}

	/**
	 * @description 创建dataSet
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @param tab
	 */
	private DataSet createDataSet(String tab) {
		DataSet dataSet = new DataSet();
		dataSet.setId("ds"+tab);
		dataSet.setDataType(dataType);
		dataSet.setDataProvider(dummyDataSet.getDataProvider());
		dataSet.setParameter(tab);
		return dataSet;
	}

	/**
	 * @description 创建组合控件
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @param tab
	 */
	private void generateGrid(String tab) {
		Container container = createVBoxContainer();
		container.addChild(createDataSet(tab));
		container.addChild(createToolBar("请选择"+tab+"表需要显示的列"));
		container.addChild(createDatagrid(tab));
		mainCon.addChild(container);
	}


	/**
	 * 
	 * @description 生成表格
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @param tab
	 * @return
	 */
	private DataGrid createDatagrid(String tab){
		DataGrid grid = new DataGrid();
		grid.setId("dg"+tab);
		grid.setDataSet("ds"+tab);
		grid.setReadOnly(true);
		grid.setSelectionMode(SelectionMode.multiRows);
		grid.addColumn(createRowSelectorColumn());
		grid.addColumn(createRowNumColumn());
		return grid;
	}
	
	/**
	 * 
	 * @description 创建选择列
	 * @author zhangkun
	 * @date 2020年6月9日
	 * @return
	 */
	private RowSelectorColumn createRowSelectorColumn(){
		RowSelectorColumn rowSelectorColumn = new RowSelectorColumn();
		rowSelectorColumn.setWidth("40");
		return rowSelectorColumn;
	}
	
	/**
	 * 
	 * @description 创建编号列
	 * @author zhangkun
	 * @date 2020年6月9日
	 * @return
	 */
	private RowNumColumn createRowNumColumn(){
		RowNumColumn rowNumColumn = new RowNumColumn();
		rowNumColumn.setWidth("40");
		return rowNumColumn;
	}
	
	/**
	 * 
	 * @description 创建toolbar
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @return
	 */
	private ToolBar createToolBar(String text){
		ToolBar toolBar = new ToolBar();
		toolBar.addItem(createLabel(text));
		return toolBar;
	}
	
	/**
	 * 
	 * @description 根据信息创建label
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @param text
	 * @return
	 */
	private Label createLabel(String text){
		Label label = new Label();
		label.setText(text);
		return label;
	}
	
	/**
	 * @description 获取参数并转成字符串数组
	 * @author zhangkun
	 * @date 2020年6月8日
	 */
	private String[] getTabs() {
		DoradoContext context = DoradoContext.getCurrent();
		String tabs = (String)context.getAttribute(DoradoContext.VIEW, "tabs");
		return tabs.split(",");
	}
	
	/**
	 * 
	 * @description 生成下一步组件
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @param mainCon
	 */
	private void addBtnNext(){
		Container btnNextCon = createHBoxContainer();
		Button btnNext = createNextButton();
		btnNextCon.addChild(btnNext);
		mainCon.addChild(btnNextCon);
	}
	
	/**
	 * 
	 * @description 生成hbox的Container
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @return
	 */
	private Container createHBoxContainer(){
		Container container = new Container();
		HBoxLayout hbox = new HBoxLayout();
		hbox.setPack(Pack.center);
		container.setLayout(hbox);
		return container;
	}
	
	/**
	 * 
	 * @description 生成vbox的Container
	 * @author zhangkun
	 * @date 2020年6月8日
	 * @return
	 */
	private Container createVBoxContainer() {
		Container container = new Container();
		VBoxLayout vbox = new VBoxLayout();
		container.setLayout(vbox);
		return container;
	}
	
	/**
	 * 
	 * @description 创建下一步按钮
	 * @author zhangkun
	 * @date 2020年6月8日
	 */
	private Button createNextButton(){
		Button btnNext = new Button();
		btnNext.setCaption("下一步");
		btnNext.addClientEventListener("onClick", new ClientEvent() {
			
			@Override
			public String getScript() {
				return nextButtonOnClickScript();
			}
		});
		return btnNext;
	}
	
	/**
	 * 
	 * @description buttonNext的onClick事件
	 * @author zhangkun
	 * @date 2020年6月9日
	 * @return
	 */
	private String nextButtonOnClickScript(){
		StringBuilder script = new StringBuilder();
		insertDisplayCols(script);
		script.append("var dialogIframe = window.parent.$id('dialogIframe').objects[0];");
		script.append("var dsDisplayRow = window.parent.$id('dsDisplayRow').objects[0];");
		script.append("var dialogNext = window.parent.$id('dialogNext').objects[0];");
		script.append("var dataSetDir = window.parent.$id('dataSetDir').objects[0];");
		script.append("var configData = window.parent.$id('dataSetConfig').objects[0].getData('#');");
		script.append("dataSetDir.set('parameter', {");
		script.append("	'workSpaceSrc': configData.get('workSpaceSrc'),");
		script.append("	'rootPkg': configData.get('rootPkg'),");
		script.append("	'template': configData.get('template')");
		script.append("}).flushAsync();");
		script.append("dialogIframe.close();");
		script.append("dialogNext.show();");
		return script.toString();
	}
	
	/**
	 * 
	 * @description 保存勾选的需要显示的列
	 * @author zhangkun
	 * @date 2020年6月9日
	 * @param script
	 */
	private void insertDisplayCols(StringBuilder script){
		script.append("var dsDisplayRow = window.parent.$id('dsDisplayRow').objects[0];");
		script.append("dsDisplayRow.clear();");
		for(String tab : tabs){
			script.append("var dg" + tab + " = view.id('dg"+ tab +"');");
			script.append("if(dg"+ tab +".get('selection').length < 1){");
			script.append("dorado.MessageBox.alert('表"+ tab +" 至少选择一列进行显示');");
			script.append("return;");
			script.append("}");
			script.append("dsDisplayRow.insert({'cols' : dg"+ tab +".get('selection')});");
		}
		
	}

}
